package laxcmdline

import (
    "bufio"
    "go.uber.org/zap"
    "os"
    "strings"
    "sync"
)

/*
此lib用于,在屏幕启动时，可以从控制台输入cmd命令
 */

// cmd回调接口类型
type CmdLineCallback func(splitParams []string) string

// @Desc: cmd管理器
type CmdLineManager struct {
    // 处理回调
    processors map[string]CmdLineCallback
}

// 注册的cmd单例
var instance *CmdLineManager
var insOnce sync.Once

func getCmdLineManager() *CmdLineManager {
    insOnce.Do(func() {
        instance = &CmdLineManager{
            processors: make(map[string]CmdLineCallback),
        }
    })
    return instance
}
// @Desc: 注册cmd
// @param cmdName cmd名字
// @param callback 回调函数
// @return bool 注册结果
func RegisterCmdLine(cmdName string, callback CmdLineCallback) bool {
    ins := getCmdLineManager()
    ins.processors[cmdName] = callback
    return true
}

// @Desc: 读取屏幕输入
func readConsole() {
    reader := bufio.NewReader(os.Stdin)
    for {
        cmdline, err := reader.ReadString('\n')
        if err != nil {
            break
        }
        if cmd := strings.Split(strings.TrimSpace(cmdline), " "); len(cmd) > 0 {
            if cb, ok := getCmdLineManager().processors[cmd[0]]; ok {
                if retMsg := cb(cmd); len(retMsg) > 0 {
                    zap.S().Infof("[CmdLine] 执行指令[%s] 返回[%s]", cmd[0], retMsg)
                }
            }
        }
    }
}

// @Desc: 启动cmdline
func StartCmdLine() {
    go readConsole()
}

// @Desc: 停止cmdline
func StopCmdLine() {

}
